跳到主要内容

训练分割器

本指南介绍如何设置和配置 OV20i 的分割功能,以自动检测、测量和分析零件中的特定特征或缺陷。当需要识别不规则形状、测量面积或检测无法通过简单分类处理的特定模式时,请使用分割功能。

何时使用分割: 表面缺陷、液体溢出、不规则形状、面积测量、模式检测,或任何需要像素级精度的特征。

开始之前

所需准备

  • 已安装并连接的 OV20i 摄像头系统
  • 带有待分割特征的测试零件(例如带有铅笔痕迹的板材)
  • 适合您应用的良好照明条件
  • 15-20 张用于训练的样本图像

步骤 1:创建分割配方

1.1 新建配方

  1. 导航至“所有配方” 页面
  2. 点击右上角的 + New Recipe
  3. 输入配方名称: 使用描述性名称,如 "Pencil_Mark_Detection" 或 "Surface_Defect_Segmentation"
  4. 选择配方类型: 从下拉菜单中选择 "Segmentation"
  5. 点击 OK 创建配方

New

1.2 激活配方

  1. 在列表中找到您的配方(显示为“Inactive”)
  2. 点击 Actions > Activate
  3. 点击 Activate 确认激活

Activate recipe

结果: 配方已激活,准备进行配置。

步骤 2:进入配方编辑器

  1. 点击活动配方旁的 Edit
  2. 点击 Open Editor 确认

Edit

现在您将看到带有分割专用选项的配方编辑器。

步骤 3:配置相机设置

3.1 打开成像配置

  1. 点击左下角的 Configure Imaging

Configure Image

3.2 优化分割对焦

对焦对于准确的边缘检测至关重要:

  1. 将测试零件放置在相机视野中
  2. 调整对焦,直到边缘清晰锐利
  3. 使用不同零件测试,确保整个产品范围内对焦一致
提示
  • 对焦应集中在缺陷/特征出现的表面
  • 确保整个感兴趣区域均处于清晰对焦状态
  • 分割时,略微过度锐化优于模糊对焦

3.3 设置最佳曝光

适当的曝光确保特征检测一致:

  1. 调整曝光,实现均衡照明
  2. 避免过曝区域(纯白区域)
  3. 确保特征清晰可见,具有良好对比度

分割曝光指导原则:

  • 特征应与背景形成明显对比
  • 避免阴影被误判为缺陷
  • 在不同零件状态(干净、脏污、磨损)下测试

3.4 配置 LED 照明模式

根据分割对象选择照明:

特征类型推荐照明原因
表面缺陷明场照明均匀照明显示表面不规则
划痕/裂纹侧光照明产生阴影突出线性缺陷
凸起特征暗场照明使凸起区域从背景中突出
液体溢出侧光照明显示表面纹理差异

3.5 调整伽马以增强特征

  1. 增加伽马值,增强特征与背景的对比
  2. 测试不同数值,观察目标特征效果
  3. 找到使特征最易区分的设置

3.6 保存配置

  1. 在实时预览中检查设置
  2. 点击 Save Imaging Settings

Save Settings

检查点: 特征应清晰可见且对比良好。

步骤 4:设置模板和对齐

4.1 进入模板部分

点击面包屑菜单中的“Template Image and Alignment”

4.2 配置对齐(可选)

Template and alignment

本示例跳过对齐:

  1. 选择 Skip Aligner,如果零件位置一致
  2. 点击 Save

Template image

何时使用对齐器: 当零件位置或方向变化较大,影响分割准确性时启用。

步骤 5:定义检测区域

5.1 进入检测设置

点击面包屑菜单中的“Inspection Setup”

5.2 设置感兴趣区域 (ROI)

ROI 定义分割执行的位置:

  1. 将测试零件放置在相机视野中
  2. 拖动 ROI 角点 框选检测区域
  3. 合理调整 ROI 大小:
    • 包含所有可能出现特征的区域
    • 排除不必要的背景区域
    • 在预期特征位置周围留有缓冲区

ROI Setup

5.3 分割 ROI 最佳实践

建议避免
覆盖整个检测表面包含无关背景物体
在边缘留缓冲空间ROI 太小,无法覆盖特征变化
考虑零件位置变化与夹具或工装重叠
使用最大预期特征测试包含永久标记区域

5.4 保存 ROI 设置

  1. 确认 ROI 覆盖所有目标区域
  2. 点击 Save

步骤 6:标注训练数据

6.1 进入标注与训练

点击面包屑菜单中的“Label And Train”

6.2 配置检测类别

  1. 点击检测类型下的 Edit
  2. 重命名类别,与您的特征匹配(如 "Pencil Mark"、"Surface Defect"、"Spill Area")
  3. 选择类别颜色,便于视觉识别
  4. 保存更改

6.3 捕获并标注训练图像

至少需要 10 张标注图像,推荐 15-20 张:

图像捕获流程

Label and Train

  1. 将第一个测试零件放入检测区域
  2. 使用相机界面拍摄图像
  3. 使用画笔工具 涂抹目标特征
  4. 准确涂抹:
    • 覆盖整个特征区域
    • 保持在特征边界内
    • 不涂抹背景区域
    • 采用一致的标注方法
  5. 点击 Save Annotations
  6. 重复上述步骤处理下一个零件

标注最佳实践

良好标注不良标注
精确的特征边界边缘涂抹不整齐
一致的特征定义标准不一致
完整覆盖特征漏标特征区域
干净的背景(未涂抹)误涂背景区域

6.4 训练数据多样性

确保训练集包含:

  • 不同大小的特征
  • 各种强度的特征
  • ROI 内多个位置
  • 不同照明条件(如适用)
  • 边缘案例和临界样本

6.5 训练数据质量检查

  1. 检查所有标注图像
  2. 确认标注方法一致
  3. 删除错误标注样本
  4. 如有必要,添加更多样本

步骤 7:训练分割模型

7.1 开始训练

  1. 标注完成后点击 Return to Live
  2. 点击 Train Segmentation Model

Start Training

7.2 配置训练参数

  1. 设置迭代次数:
    • 快速训练: 50-100 次迭代(5-10 分钟)
    • 生产质量: 200-500 次迭代(15-30 分钟)
    • 高精度: 500 次以上迭代(30 分钟以上)
  2. 点击 Start Training

7.3 监控训练进度

训练界面显示:

  • 当前迭代次数
  • 训练准确率百分比
  • 预计完成时间

Training

训练控制:

  • Abort Training: 出现问题时停止训练
  • Finish Training Early: 达到满意准确率时提前结束

Training 2

提示
  • 85% 准确率通常适合生产使用
  • 训练将在达到目标准确率时自动停止
  • 增加训练数据往往比增加迭代次数更有效

步骤 8:测试分割性能

8.1 进入实时预览

  1. 训练完成后点击 Live Preview
  2. 使用多种零件测试:
    • 已知良品(应无或极少分割结果)
    • 已知缺陷品(应突出显示缺陷)
    • 边缘案例和临界样本

Live preview

8.2 评估结果

检查分割质量:

指标良好表现需改进
准确率持续检测真实特征漏检明显特征
精确度误报少背景误报多
边缘质量边界清晰准确边缘粗糙不准确
一致性重复测试结果相似结果波动大

8.3 解决性能不佳问题

问题可能原因解决方案
漏检特征训练数据不足添加更多标注样本
误报多照明/对比度差优化成像设置
边缘粗糙图像质量差改善对焦和照明
结果不稳定训练样本多样性不足增加多样样本

步骤 9:配置通过/失败逻辑

9.1 进入 IO 模块

  1. 确保 AI 模型显示绿色(已训练状态)
  2. 通过面包屑菜单导航至 IO Block

9.2 删除默认逻辑

  1. 删除 Classification Block Logic 节点
  2. 准备构建自定义分割逻辑

9.3 构建分割流程

使用 Node-RED 创建以下组件:

  1. 从左侧面板拖拽节点:
    • Function 节点(用于逻辑)
    • Debug 节点(用于测试)
    • 最终 Pass/Fail 节点
  2. 用连线连接节点

NodeRed

9.4 根据需求配置逻辑

选项 A:无缺陷即通过

应用场景: 任何检测到特征即判为不合格的质量检查

Function 节点代码:

const allBlobs = msg.payload.segmentation.blobs;
const results = allBlobs.length < 1; // 无特征即通过
msg.payload = results;
return msg;

选项 B:仅小缺陷通过

应用场景: 接受低于尺寸阈值的小缺陷

Function 节点代码:

const threshold = 500; // 像素数量阈值,可调整
const allBlobs = msg.payload.segmentation.blobs;
const allUnderThreshold = allBlobs.every(blob => blob.pixel_count < threshold);
msg.payload = allUnderThreshold;
return msg;

选项 C:缺陷总面积小即通过

应用场景: 接受缺陷总面积有限的零件

Function 节点代码:

const threshold = 5000; // 总像素阈值,可调整
const allBlobs = msg.payload.segmentation.blobs;
const totalArea = allBlobs.reduce((sum, blob) => sum + blob.pixel_count, 0);
msg.payload = totalArea < threshold;
return msg;

9.5 配置 Function 节点

  1. 双击 Function 节点
  2. 复制上述合适的代码
  3. 粘贴至“On Message”标签页
  4. 根据应用调整阈值
  5. 点击 Done

9.6 部署并测试逻辑

  1. 点击 Deploy 激活逻辑
  2. 导航至 HMI 进行测试
  3. 使用已知良品和不良品测试
  4. 确认通过/失败结果符合预期

步骤 10:生产验证

10.1 全面测试

使用以下测试验证分割系统:

测试用例预期结果失败时操作
干净零件通过(无分割)调整阈值或重新训练
轻微缺陷根据标准通过/失败优化逻辑参数
严重缺陷失败(明显分割)检查模型准确性
边缘案例行为一致添加训练数据

10.2 性能验证

监控指标:

  • 每次检测处理时间
  • 多次测试结果一致性
  • 生产环境照明下准确率
  • 长时间运行的可靠性

10.3 最终调整

若性能不理想:

  1. 增加边缘案例训练数据
  2. 调整逻辑中的阈值
  3. 改善成像条件
  4. 增加迭代次数重新训练模型

成功!您的分割系统已准备就绪

您现在拥有一个可:

  • 自动检测 特定特征或缺陷
  • 像素级精度测量面积
  • 根据需求应用自定义通过/失败逻辑
  • 通过 I/O 控制集成到生产系统

高级配置选项

自定义阈值逻辑

针对复杂验收标准,可组合多条件:

const smallThreshold = 200;
const largeThreshold = 1000;
const maxTotalArea = 3000;

const allBlobs = msg.payload.segmentation.blobs;
const smallBlobs = allBlobs.filter(blob => blob.pixel_count < smallThreshold);
const largeBlobs = allBlobs.filter(blob => blob.pixel_count > largeThreshold);
const totalArea = allBlobs.reduce((sum, blob) => sum + blob.pixel